#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

#define LEFT  "["
#define RIGHT "]"
#define LABLE "$"
#define DEBLE " \t"
#define LINE_SIZE 1024
#define ARGC_SIZE 32
#define EXIT_CODE 44

int lastcode=0;
int quit=0;
extern char **environ;
char commandline[LINE_SIZE];
char pwd[LINE_SIZE];
char *argv[ARGC_SIZE];
char myenv[LINE_SIZE];

void getpwd(){
    getcwd(pwd,sizeof(pwd));
}

int splitstring(char cline[],char*_argv[])
{
    int i=0;
    _argv[i++]=strtok(cline,DEBLE);
    while(_argv[i++]=strtok(NULL,DEBLE));//
    return i-1;
}


void NormalExcute(char* _argc[])//普通命令
{
   pid_t id=fork();
   if(id<0)
   {
       perror("fork");
      return;
   }
   else if (id==0)
   {
      execvp(_argc[0],_argc);
      exit(EXIT_CODE);
   }
   else
   {
       int status=0;
       pid_t ret=waitpid(id,&status,0);
       if(ret==id)
       {
           lastcode=WEXITSTATUS(status);
       }
   }
}

const char *get_username(){
    return getenv("USER");
}

const char *get_hostname(){
    return getenv("HOSTNAME");
}


void interact(char* cline,int size){
    getpwd();
   // printf("%s",getenv("HOSTNAME"));
    printf(LEFT"%s@%s %s"RIGHT""LABLE " ",get_username(),get_hostname(),pwd);
    char*s=fgets(cline,size,stdin);
    assert(s);
    (void)s; 
    cline[strlen(cline)-1]='\0';
    //sleep();
}

int bulidCommand(char*_argv[],int _argc)
{
   if(_argc==2 && strcmp(_argv[0],"cd")==0){
       chdir(_argv[1]);
       getpwd();
      // sprintf(getenv("PWD"),"%s",pwd);
      // return 1;
   }
   else if(_argc==2&&strcmp(_argv[0],"export")==0){
       strcpy(myenv,_argv[1]);
       putenv(myenv);
       return 1;
   }
   else if(_argc==2&&strcmp(_argv[0],"echo")==0){
       if(strcmp(_argv[1],"$?")==0)
       {
           printf("%d\n",lastcode);
       }
       else if(*_argv[1]=='$'){
           char*val=getenv(_argv[1]+1);
           if(val)
               printf("%s\n",val);
       }
       else
       {
           printf("%s\n",_argv[1]);
       }
       return 1;
   }
   
   if(strcmp(_argv[0],"ls")==0)
   {
       _argv[_argc++]="--color";
       _argv[_argc]=NULL;
   }
   return 0;
}

int main()
{
    //printf("%s",getenv("HOSTNAME"));
    //printf("%s",getenv("HOSTNAME"));
    while(1){
        interact(commandline,sizeof(commandline));
        int argc=splitstring(commandline,argv);
        if(argc==0)continue;
        int n=bulidCommand(argv,argc);
        if(!n)NormalExcute(argv);
    }
    return 0;
}

